<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>js注入，黑客之路必备！ - 小明快点跑 - 博客园</title>
<link type="text/css" rel="stylesheet" href="/bundles/blog-common.css?v=ChDk9h03-S75WEqNhGvXkWireJ5cCWdK1xRM9NIXfnM1"/>
<link id="MainCss" type="text/css" rel="stylesheet" href="/skins/Banlieue13/bundle-Banlieue13.css?v=-BwbBCgL4I6ev4eT0WChGlx86DuTjkHbdqzbBDeklxs1"/>
<link id="mobile-style" media="only screen and (max-width: 768px)" type="text/css" rel="stylesheet" href="/skins/Banlieue13/bundle-Banlieue13-mobile.css?v=RMNzrfV_gFDOY0YIxh5jAkRoIfox6Z9pvm_4_uyrjVU1"/>
<link title="RSS" type="application/rss+xml" rel="alternate" href="http://www.cnblogs.com/xiaoming0601/rss"/>
<link title="RSD" type="application/rsd+xml" rel="EditURI" href="http://www.cnblogs.com/xiaoming0601/rsd.xml"/>
<link type="application/wlwmanifest+xml" rel="wlwmanifest" href="http://www.cnblogs.com/xiaoming0601/wlwmanifest.xml"/>

</head>
<body>
<a name="top"></a>

<!--done-->
<div id="home">
<div id="header">
	<div id="blogTitle">
	<a id="lnkBlogLogo" href="http://www.cnblogs.com/xiaoming0601/"><img id="blogLogo" src="/Skins/custom/images/logo.gif" alt="返回主页" /></a>			
		
<!--done-->
<h1><a id="Header1_HeaderTitle" class="headermaintitle" href="http://www.cnblogs.com/xiaoming0601/">小明快点跑</a></h1>
<h2></h2>



		
	</div><!--end: blogTitle 博客的标题和副标题 -->
</div><!--end: header 头部 -->

<div id="main">
	<div id="mainContent">
	<div class="forFlow">
		<div id="navigator">
			
<ul id="navList">
	<li><a id="blog_nav_sitehome" class="menu" href="http://www.cnblogs.com/">博客园</a></li>
	<li><a id="blog_nav_myhome" class="menu" href="http://www.cnblogs.com/xiaoming0601/">首页</a></li>
	<li><a id="blog_nav_newpost" class="menu" rel="nofollow" href="https://i.cnblogs.com/EditPosts.aspx?opt=1">新随笔</a></li>
	<li><a id="blog_nav_contact" accesskey="9" class="menu" rel="nofollow" href="https://msg.cnblogs.com/send/%E5%B0%8F%E6%98%8E%E5%BF%AB%E7%82%B9%E8%B7%91">联系</a></li>
	<li><a id="blog_nav_admin" class="menu" rel="nofollow" href="https://i.cnblogs.com/">管理</a></li>
	<li><a id="blog_nav_rss" class="menu" href="http://www.cnblogs.com/xiaoming0601/rss">订阅</a>
	<a id="blog_nav_rss_image" class="aHeaderXML" href="http://www.cnblogs.com/xiaoming0601/rss"><img src="//www.cnblogs.com/images/xml.gif" alt="订阅" /></a></li>
</ul>


			<div class="blogStats">
				
				<div id="blog_stats">
<!--done-->
随笔- 39&nbsp;
文章- 0&nbsp;
评论- 33&nbsp;
</div>
				
			</div><!--end: blogStats -->
		</div><!--end: navigator 博客导航栏 -->
		
<div id="post_detail">
<!--done-->
<div id="topics">
	<div class = "post">
		<h1 class = "postTitle">
			<a id="cb_post_title_url" class="postTitle2" href="http://www.cnblogs.com/xiaoming0601/p/5872456.html">js注入，黑客之路必备！</a>
		</h1>
		<div class="clear"></div>
		<div class="postBody">
			<div id="cnblogs_post_body"><p>　　最近刚出了新闻，阿里四名网络安全部门员工利用网页漏洞写js脚本抢月饼，于是兴致来了，想了解一下这个js脚本到底怎么写，各种刷单各种抢枪抢又是怎么实现的。</p>
<h3>什么是javascript注入攻击？</h3>
<p>　　1.每当接受用户输入的内容并重新显示这些内容时，网站就很容易遭受 JavaScript 注入攻击。让我们研究一个容易遭受 JavaScript 注入攻击的具体应用程序。假设已经创建了一个客户反馈网站。客户可以访问网站并输入对产品的反馈信息。当客户提交反馈时，反馈信息重新显示在反馈页面上。<br />客户反馈网站是一个简单的网站。不幸的是，此网站容易遭受 JavaScript 注入攻击。<br />假设正在将以下文本输入到客户反馈表单中：</p>
<div class="cnblogs_Highlighter">
<pre class="brush:html;gutter:true;">&lt;script&gt;alert(&ldquo;Attack!&rdquo;)&lt;/script&gt;  
</pre>
</div>
<p>　　此文本表示显示警告消息框的 JavaScript 脚本。在某人将此脚本提交到客户反馈表单后，消息Attack! 会在将来任何人访问客户反馈网站时显示。</p>
<p>　　2.还有一种就是在浏览器地址栏中输入一段js代码，用来改变页面js变量、页面标签的内容。</p>
<p>使用Javascript注入，用户不需要关闭或保存网页就可以改变其内容，这是在浏览器的地址栏上完成的。命令的语法如下：</p>
<div class="cnblogs_Highlighter">
<pre class="brush:html;gutter:true;">javascript:alert(#command#) 
</pre>
</div>
<p>　　例如，如果你想在http://www.example.com站点上看到一个alert警告框，那么首先在地址栏上输入URL并等待页面加载完成，然后删掉URL并输入：</p>
<div class="cnblogs_Highlighter">
<pre class="brush:html;gutter:true;">javascript:alert("Hello World") 
</pre>
</div>
<p>　　&nbsp;作为新的URL。这将弹出一个&ldquo;Hello World&rdquo;警告框，使用这一技术几乎可以改变网页的任何内容，例如一张图片。假设有一张网站logo图片，我们通过查看页面源文件找到其中一段HTML代码：</p>
<div class="cnblogs_Highlighter">
<pre class="brush:html;gutter:true;">&lt;IMG Name="hi" SRC="hello.gif"&gt;
</pre>
</div>
<p>　　图片被命名为&ldquo;hi&rdquo;，源文件是&ldquo;hello.gif&rdquo;，我们想要把它改成存储在我们站点（http://www.mysite.com）上的 &ldquo;bye.jpeg&rdquo;文件，因此图片完整的URL地址是http://www.mysite.com/bye.jpeg，使用Javascript注入， 我们只需要在地址栏上输入：</p>
<div class="cnblogs_Highlighter">
<pre class="brush:html;gutter:true;">javascript:alert(document.hi.src="http://www.mysite.com/bye.jpeg") </pre>
</div>
<p>　　你将会看到弹出&ldquo;http://www.mysite.com/bye.jpeg&rdquo;alert警告，然后图片就被更改了。需要注意的是，这些更改只是暂时的！如果你刷新页面或者重新进入，你的更改将会消失，因为你只是在你的PC作了这些更改，而不是在网页服务器上。</p>
<p>　　使用同样的方法我们可以查看或更改变量的值，例如我们在网页上找到一段这样的代码：</p>
<div class="cnblogs_Highlighter">
<pre class="brush:html;gutter:true;">&lt;SCRIPT LANGUAGE="JavaScript"&gt;
var a="test"
&lt;/SCRIPT&gt; 
</pre>
</div>
<p>　　意思是变量a的值为&ldquo;test&rdquo;，现在我们输入：</p>
<div class="cnblogs_Highlighter">
<pre class="brush:html;gutter:true;">javascript:alert(a)  
</pre>
</div>
<p>　　然后我们将其值改为&ldquo;hello&rdquo;：</p>
<div class="cnblogs_Highlighter">
<pre class="brush:html;gutter:true;">javascript:alert(a="hello") 
</pre>
</div>
<p>　　&nbsp;Javascript注入通常被用来更改表单属性，假设有一段这样的代码：</p>
<div class="cnblogs_Highlighter">
<pre class="brush:html;gutter:true;">&lt;form name="format" action="send.php" method="post"&gt;
&lt;input type="hidden" name="mail" value="someone@somewhere.com"&gt;
&lt;input type="text" name="name"&gt;
&lt;input type="submit" value="submit"&gt;&lt;/form&gt;
</pre>
</div>
<p>　　我们想让表单发送到我们的邮箱，而不是someone@somewhere.com。可以使用如下命令：</p>
<div class="cnblogs_Highlighter">
<pre class="brush:html;gutter:true;">javascript:alert(document.format.mail.value="me@hacker.com") </pre>
</div>
<ul>
<li>也许你已经注意到了这些命令的层次关系：</li>
<li>我们按照从左到右的顺序依次说明：</li>
<li>1)最左边是document</li>
<li>2)然后是我们想要更改的对象名(比如document.hi.src)或其包含的对象(比如document.format.mail.value)</li>
<li>3)最后是我们想要更改的属性(比如源路径:document.hi.src，或变量值:document.format.mail.value)</li>
<li>4)使用&ldquo;.&rdquo;号分隔</li>
<li>5)当我们想要更改属性值的时候，我们使用&ldquo;=&rdquo;号和新的属性值</li>
<li>*注释:当新的属性值为字符串时(比如:document.format.mail.value="me@hacker.com")需要用双引号把它括起来。</li>
<li>如果我们想要把它作为一个变量的值，则不需要使用双引号""。例如我们想要将变量b的值赋予变量a，我们可以输入javascript:alert(a=b)。</li>
<li>但是,页面中的大部分标签都没有名字，比如：</li>
</ul>
<div class="cnblogs_Highlighter">
<pre class="brush:html;gutter:true;">&lt;form action="send.php" method="post"&gt;
&lt;input type="hidden" name="mail" value="someone@somewhere.com"&gt;
&lt;input type="text" name="name"&gt;
&lt;input type="submit" value="submit"&gt;&lt;/form&gt;
</pre>
</div>
<p>　　在这段代码中没有表单名，综合上面这些信息，可以使用此命令：</p>
<div class="cnblogs_Highlighter">
<pre class="brush:html;gutter:true;">javascript:alert(document. .mail.value="me@hacker.com")
</pre>
</div>
<p>　　&nbsp;在这种情况下我们必须统计并找出表单序号，下面是一个例子：</p>
<div class="cnblogs_Highlighter">
<pre class="brush:html;gutter:true;">&lt;form action="send.php" method="post"&gt;
&lt;input type="text" name="name"&gt;
&lt;input type="submit" value="submit"&gt;
&lt;/form&gt;

&lt;form action="send.php" method="post"&gt;
&lt;input type="hidden" name="mail" value="someone@somewhere.com"&gt;
&lt;input type="text" name="name"&gt;
&lt;input type="submit" value="submit"&gt;
&lt;/form&gt;

&lt;form action="send.php" method="post"&gt;
&lt;input type="text" name="name"&gt;
&lt;input type="submit" value="submit"&gt;
&lt;/form&gt; </pre>
</div>
<ul>
<li>在以上代码中我们看见了3个表单，但我们只对第二个感兴趣，因此我们想要的表单序号就是2。不要忘记我们是从1开始计算的,比如1,2,3,4...而javascript却从0开始计算，比如0,1,2,3...所以真正的表单序号是1，不是2，通常我们要把找到的表单序号减一。我们将用这个序号来补全我们的命令:</li>
</ul>
<div class="cnblogs_Highlighter">
<pre class="brush:html;gutter:true;">javascript:alert(document.forms[1].mail.value="me@hacker.com") </pre>
</div>
<ul>
<li>这样你就可以更改没有名字的图片或链接了，你可以把&ldquo;forms&rdquo;换成任何你想要的标签类型。对于图片就是</li>
</ul>
<div class="cnblogs_Highlighter">
<pre class="brush:html;gutter:true;">javascript:alert(document.images[3].src="#the url of the picture you want#") 
</pre>
</div>
<p>　　对于链接就是</p>
<div class="cnblogs_Highlighter">
<pre class="brush:html;gutter:true;">javascript:alert(document.links[0].href="#the url you want#")  </pre>
</div>
<ul>
<li>&nbsp;最后，我们可以用这个技巧来编辑cookies。下面的命令由triviasecurity.net的Dr_aMado编写，我只修改了一点点，让它在用户编辑之前显示出来。你只要把它们复制到地址栏就可以了：</li>
</ul>
<div class="cnblogs_Highlighter">
<pre class="brush:html;gutter:true;">javascript:alert(window.c=function a(n,v,nv){c=document.cookie;c=c.substring(c.indexOf(n)+n.length,c.length);
c=c.substring(1,( (c.indexOf(";")&gt;-1) ? c.indexOf(";") : c.length));nc=unescape(c).replace(v,nv);
document.cookie=n+"="+escape(nc);return unescape(document.cookie);});
alert('The cookie is: "'+document.cookie+'"');alert(c(prompt("The name of the cookie:",""),
prompt("Change this value:",""),prompt("with this:","")))</pre>
</div>
<div class="cnblogs_Highlighter">
<pre class="brush:html;gutter:true;">//如果你想要手动更改你的cookie，可以使用下面这条命令：
javascript:alert(document.cookie)
</pre>
</div>
<p>　　这将显示你的当前cookie，假设是&ldquo;userid=1&rdquo;，如果你想把它改成&ldquo;userid=2&rdquo;，可以使用下列命令：</p>
<div class="cnblogs_Highlighter">
<pre class="brush:html;gutter:true;">javascript:alert(document.cookie="userid=2")
</pre>
</div>
<p>　　最后我必须强调的是，所有的更改都只是在客户端！就像是把网页保存在你的PC上然后修改它。尽管如此，使用这一技巧你仍然可以欺骗页面(例如cookies)或绕过安全验证。例如一些网页会检测用户发送数据的位置，如果从http://www.test.com/form.php 发送数据到http://www.test.com/check.php，check.php可能会检测数据是否来自http: //www.test.com/form.php上的表单。除此之外，如果你打算在页面中输入你自己的JavaScript代码，通过使用一些这样的技巧，你将能够更改图片并保持不变！</p>
<p>　　最后的最后，既然js注入这么可怕，我们自己写的网站有什么解决办法来防止js注入呢？</p>
<p>方法一：</p>
<p>　　阻止 JavaScript 注入攻击的一种简单方法是重新在视图中显示数据时，用 HTML 编码任何网站用户输入的数据&nbsp;<br />如：&lt;%=Html.Encode(feedback.Message)%&gt;&nbsp;<br />使用 HTML 编码一个字符串的含意是什么呢？使用 HTML 编码字符串时，危险字符如 &lt; 和 &gt; 被替换为 HTML 实体，如 &amp;lt; 和 &amp;gt;。所以，当使用 HTML 编码字符串 &lt;script&gt;alert("Boo!")&lt;/script&gt; 时，它将转换为 &amp;lt;script&amp;gt;alert("Attack!")&amp;lt;/script&amp;gt;。浏览器在解析编码的字符串时不再执行 JavaScript 脚本。而是显示无害的页面。</p>
<p>方法二：</p>
<p>　　除了在视图中显示数据时使用 HTML 编码数据，还可以在将数据提交到数据库之前使用 HTML 编码数据。</p>
<div class="cnblogs_code">
<pre>StringEscapeUtils.escapeHtml（"前台提交的数据"); </pre>
</div>
<p>　　通常，人们喜欢使用本教程中讨论的第一种方法，而不喜欢使用第二种方法。第二种方法的问题在于在数据库中最终会保留 HTML 编码的数据。换言之，数据库中的数据会包含奇怪的字符。这有什么坏处呢？如果需要用除网页以外的形式显示数据库数据，则将遇到问题。例如，不能轻易在 Windows Forms 应用程序中显示数据。</p>
<p>&nbsp;</p>
<p>感谢网友分享：<a href="http://zxf-noimp.iteye.com/blog/1130771">http://zxf-noimp.iteye.com/blog/1130771</a></p></div><div id="MySignature"></div>
<div class="clear"></div>
<div id="blog_post_info_block">
<div id="BlogPostCategory"></div>
<div id="EntryTag"></div>
<div id="blog_post_info">
</div>
<div class="clear"></div>
<div id="post_next_prev"></div>
</div>


		</div>
		<div class = "postDesc">posted @ <span id="post-date">2016-09-14 15:32</span> <a href='http://www.cnblogs.com/xiaoming0601/'>小明快点跑</a> 阅读(<span id="post_view_count">...</span>) 评论(<span id="post_comment_count">...</span>)  <a href ="https://i.cnblogs.com/EditPosts.aspx?postid=5872456" rel="nofollow">编辑</a> <a href="#" onclick="AddToWz(5872456);return false;">收藏</a></div>
	</div>
	<script type="text/javascript">var allowComments=true,cb_blogId=288146,cb_entryId=5872456,cb_blogApp=currentBlogApp,cb_blogUserGuid='7d037daa-3a27-e611-9fc1-ac853d9f53cc',cb_entryCreatedDate='2016/9/14 15:32:00';loadViewCount(cb_entryId);var cb_postType=1;</script>
	
</div><!--end: topics 文章、评论容器-->
</div><a name="!comments"></a><div id="blog-comments-placeholder"></div><script type="text/javascript">var commentManager = new blogCommentManager();commentManager.renderComments(0);</script>
<div id='comment_form' class='commentform'>
<a name='commentform'></a>
<div id='divCommentShow'></div>
<div id='comment_nav'><span id='span_refresh_tips'></span><a href='javascript:void(0);' onclick='return RefreshCommentList();' id='lnk_RefreshComments' runat='server' clientidmode='Static'>刷新评论</a><a href='#' onclick='return RefreshPage();'>刷新页面</a><a href='#top'>返回顶部</a></div>
<div id='comment_form_container'></div>
<div class='ad_text_commentbox' id='ad_text_under_commentbox'></div>
<div id='ad_t2'></div>
<div id='opt_under_post'></div>
<div id='cnblogs_c1' class='c_ad_block'></div>
<div id='under_post_news'></div>
<div id='cnblogs_c2' class='c_ad_block'></div>
<div id='under_post_kb'></div>
<div id='HistoryToday' class='c_ad_block'></div>
</div>


	</div><!--end: forFlow -->
	</div><!--end: mainContent 主体内容容器-->

	<div id="sideBar">
		<div id="sideBarMain">
			
<!--done-->
<div class="newsItem">
<h3 class="catListTitle">公告</h3>
	<div id="blog-news"></div><script type="text/javascript">loadBlogNews();</script>
</div>

			<div id="calendar"><div id="blog-calendar" style="display:none"></div><script type="text/javascript">loadBlogDefaultCalendar();</script></div>
			
			<DIV id="leftcontentcontainer">
				<div id="blog-sidecolumn"></div><script type="text/javascript">loadBlogSideColumn();</script>
			</DIV>
			
		</div><!--end: sideBarMain -->
	</div><!--end: sideBar 侧边栏容器 -->
	<div class="clear"></div>
	</div><!--end: main -->
	<div class="clear"></div>
	<div id="footer">
		
<!--done-->
Copyright &copy;2017 小明快点跑
	</div><!--end: footer -->
</div><!--end: home 自定义的最大容器 -->
<button type="button" id="ck">点击</button>
</body>
<script type="text/javascript" src="../jquery/jquery-3.2.1.min.js">/*learn_jquery_demo1 loading file*/</script>
<script type="text/javascript">
/*code*/
$("document").ready(function(){//ready
	$("#ck").click(function(){//jquery事件
		$("p").hide();
	});
});
</script>
</html>
